package com.marquisx.common.ui.dialog;

import com.marquisx.tzdice.R;

import android.app.AlertDialog;
import android.content.*;
import android.graphics.Color;
import android.util.Log;
import android.view.*;
import android.widget.*;

public class AmbilWarnaDialog
{
	private static final String TAG = AmbilWarnaDialog.class.getSimpleName();

	public interface OnAmbilWarnaListener
	{
		void onCancel(AmbilWarnaDialog dialog);

		void onOk(AmbilWarnaDialog dialog, int color);
	}

	AlertDialog dialog;
	OnAmbilWarnaListener listener;
	View viewHue;
	AmbilWarnaKotak viewKotak;
	ImageView panah;
	View viewWarnaLama;
	View viewWarnaBaru;
	ImageView viewKeker;

	float satudp;
	int warnaLama;
	int warnaBaru;
	float hue;
	float sat;
	float val;
	float ukuranUiDp = 240.f;
	float ukuranUiPx; // diset di constructor

	public AmbilWarnaDialog(Context context, int color, OnAmbilWarnaListener listener)
	{
		this.listener = listener;
		this.warnaLama = color;
		this.warnaBaru = color;
		Color.colorToHSV(color, tmp01);
		hue = tmp01[0];
		sat = tmp01[1];
		val = tmp01[2];

		satudp = context.getResources().getDimension(R.dimen.ambilwarna_satudp);
		ukuranUiPx = ukuranUiDp * satudp;
		Log.d(TAG, "satudp = " + satudp + ", ukuranUiPx=" + ukuranUiPx); //$NON-NLS-1$//$NON-NLS-2$

		View view = LayoutInflater.from(context).inflate(R.layout.ambilwarna_dialog, null);
		viewHue = view.findViewById(R.id.ambilwarna_viewHue);
		viewKotak = (AmbilWarnaKotak) view.findViewById(R.id.ambilwarna_viewKotak);
		panah = (ImageView) view.findViewById(R.id.ambilwarna_panah);
		viewWarnaLama = view.findViewById(R.id.ambilwarna_warnaLama);
		viewWarnaBaru = view.findViewById(R.id.ambilwarna_warnaBaru);
		viewKeker = (ImageView) view.findViewById(R.id.ambilwarna_keker);

		letakkanPanah();
		letakkanKeker();
		viewKotak.setHue(hue);
		viewWarnaLama.setBackgroundColor(color);
		viewWarnaBaru.setBackgroundColor(color);

		viewHue.setOnTouchListener(new View.OnTouchListener()
		{
			@Override
			public boolean onTouch(View v, MotionEvent event)
			{
				if (event.getAction() == MotionEvent.ACTION_MOVE || event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_UP)
				{

					float y = event.getY(); // dalam px, bukan dp
					if (y < 0.f) y = 0.f;
					if (y > ukuranUiPx) y = ukuranUiPx - 0.001f;

					hue = 360.f - 360.f / ukuranUiPx * y;
					if (hue == 360.f) hue = 0.f;

					warnaBaru = hitungWarna();
					// update view
					viewKotak.setHue(hue);
					letakkanPanah();
					viewWarnaBaru.setBackgroundColor(warnaBaru);

					return true;
				}
				return false;
			}
		});
		viewKotak.setOnTouchListener(new View.OnTouchListener()
		{
			@Override
			public boolean onTouch(View v, MotionEvent event)
			{
				if (event.getAction() == MotionEvent.ACTION_MOVE || event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_UP)
				{

					float x = event.getX(); // dalam px, bukan dp
					float y = event.getY(); // dalam px, bukan dp

					if (x < 0.f) x = 0.f;
					if (x > ukuranUiPx) x = ukuranUiPx;
					if (y < 0.f) y = 0.f;
					if (y > ukuranUiPx) y = ukuranUiPx;

					sat = (1.f / ukuranUiPx * x);
					val = 1.f - (1.f / ukuranUiPx * y);

					warnaBaru = hitungWarna();
					// update view
					letakkanKeker();
					viewWarnaBaru.setBackgroundColor(warnaBaru);

					return true;
				}
				return false;
			}
		});

		dialog = new AlertDialog.Builder(context).setView(view).setPositiveButton(R.string.label_ok, new DialogInterface.OnClickListener()
		{
			@Override
			public void onClick(DialogInterface dialog, int which)
			{
				if (AmbilWarnaDialog.this.listener != null)
				{
					AmbilWarnaDialog.this.listener.onOk(AmbilWarnaDialog.this, warnaBaru);
				}
			}
		}).setNegativeButton(R.string.label_cancel, new DialogInterface.OnClickListener()
		{
			@Override
			public void onClick(DialogInterface dialog, int which)
			{
				if (AmbilWarnaDialog.this.listener != null)
				{
					AmbilWarnaDialog.this.listener.onCancel(AmbilWarnaDialog.this);
				}
			}
		}).create();

	}

	@SuppressWarnings("deprecation")
	protected void letakkanPanah()
	{
		float y = ukuranUiPx - (hue * ukuranUiPx / 360.f);
		if (y == ukuranUiPx) y = 0.f;

		AbsoluteLayout.LayoutParams layoutParams = (AbsoluteLayout.LayoutParams) panah.getLayoutParams();
		layoutParams.y = (int) (y + 4);
		panah.setLayoutParams(layoutParams);
	}

	@SuppressWarnings("deprecation")
	protected void letakkanKeker()
	{
		float x = sat * ukuranUiPx;
		float y = (1.f - val) * ukuranUiPx;

		AbsoluteLayout.LayoutParams layoutParams = (AbsoluteLayout.LayoutParams) viewKeker.getLayoutParams();
		layoutParams.x = (int) (x + 3);
		layoutParams.y = (int) (y + 3);
		viewKeker.setLayoutParams(layoutParams);
	}

	float[] tmp01 = new float[3];

	private int hitungWarna()
	{
		tmp01[0] = hue;
		tmp01[1] = sat;
		tmp01[2] = val;
		return Color.HSVToColor(tmp01);
	}

	public void show()
	{
		dialog.show();
	}
}